package cloud.zhixinglu.www.spring.boot.mybatis.plus.generator;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * @author weixin
 * @date 2022-04-13 下午5:25
 */
public class NewMybatisPlusGenerator {

	/**
	 * 包名
	 *
	 */
	private static final String PACKAGE_NAME = "cloud.zhixinglu.www.spring.boot.mybatis.plus";

	/**
	 * 代码生成者
	 */
	private static final String AUTHOR = "WeiXin";

	/**
	 * 驱动连接的URL
	 */
	private static final String URL = "jdbc:postgresql://39.105.36.172:5432/cloud_agi_tool?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true&stringtype=unspecified";

	/**
	 * 数据库密码
	 * 云端数据库密码：xyx-cloud-1314
	 * 本地数据库密码：1q2w3e4r5t
	 */
	private static final String USER_NAME = "root";
	private static final String PASSWORD = "zjwz8888";

	/**
	 * 根路径
	 */
	private static final String ROOT_PATH = System.getProperty("user.dir") + "/database-orm/";

	/**
	 * 项目名称
	 *
	 */
	private static final String PROJECT_NAME = "spring-boot-mybatis-plus";

	/**
	 * 输出目录
	 */
	private static final String OUTPUT = ROOT_PATH + PROJECT_NAME  + "/src/main/java/";

	/**
	 * Mapper 输出目录
	 */
	private static final String XML_PATH = ROOT_PATH + PROJECT_NAME + "/src/main/resources/mapper/";

	/**
	 * 数据库表名列表
	 */
	private static final String TABLE_LIST = "test";

	/**
	 * main函数
	 * @param args String[]
	 */
	public static void main(String[] args) {
		FastAutoGenerator.create(URL, USER_NAME, PASSWORD)
				// 全局配置(GlobalConfig)
			  .globalConfig(builder -> { builder
					      // 设置作者
						  .author(AUTHOR)
						  // 开启 swagger 模式
						  // .enableSwagger()
						  // 时间策略
						  .dateType(DateType.TIME_PACK)
						  // 注释日期
						  .commentDate("yyyy-MM-dd HH:mm:ss")
						  // 指定输出目录
						  .outputDir(OUTPUT);
			  })
				// 包配置(PackageConfig)
			  .packageConfig(builder -> builder
					  // 设置父包名
					  .parent(PACKAGE_NAME)
					  // 父包模块名
					  .moduleName("")
					  // Entity 包名
					  .entity("entity")
					  // Service 包名
					  .service("service")
					  // Service Impl 包名
					  .serviceImpl("service.impl")
					  // Mapper 包名
					  .mapper("mapper")
					  // Mapper XML 包名
					  .xml("mapper.xml")
					  // Controller 包名
					  .controller("controller")
					  // 路径配置信息
					  .pathInfo(Collections.singletonMap(OutputFile.mapperXml, XML_PATH)))
				// 策略配置(StrategyConfig)
			  .strategyConfig(builder -> {builder
						  // 开启大写命名
						  .enableCapitalMode()
						  // 开启跳过视图
						  .enableSkipView()
						  // 禁用SQL过滤
						  .disableSqlFilter()
						  // 启用 schema
						  .enableSchema()
						  // 增加表排除匹配(内存过滤)
						  // include 与 exclude 只能配置一项 ，支持正则匹配、例如 .*st$ 所有 st 结尾的表名
						  .addInclude(TABLE_LIST)

						  // 实体策略配置
						  .entityBuilder()
						  // 禁用生成 serialVersionUID
						  .disableSerialVersionUID()
						  // 开启链式模型
						  .enableChainModel()
						  // 开启 lombok 模型
						  .enableLombok()
						  // 启用表字段注解
						  .enableTableFieldAnnotation()
						  // 数据库表映射到实体的命名策略
						  // 默认下划线转驼峰命名:NamingStrategy.underline_to_camel
						  .naming(NamingStrategy.underline_to_camel)
						  // 数据库表字段映射到实体的命名策略
						  // 默认为 null，未指定按照 naming 执行
						  .columnNaming(NamingStrategy.underline_to_camel)
						  // 全局主键类型
						  .idType(IdType.AUTO)
					      .formatFileName("%sEntity")

						  // 配置controller 策略
						  .controllerBuilder()
						  // 开启生成@RestController 控制器
						  .enableRestStyle()
						  // 开启驼峰转连字符
					      .enableHyphenStyle()
					  	  // 转换文件名称
					      .formatFileName("%sController")

						  .serviceBuilder()
					       // 格式化 service 接口文件名称
					      .formatServiceFileName("%sService")
					      .formatServiceImplFileName("%sServiceImpl")

						  // 配置mapper策略
						  .mapperBuilder()
					      // 开启 @Mapper 注解
					      .enableMapperAnnotation()
						  // 启用 BaseResultMap
						  .enableBaseResultMap()
					      // 启用 BaseColumnList
						  .enableBaseColumnList()
					      // 格式化 mapper 文件名称
						  .formatMapperFileName("%sMapper")
					      // 格式化 xml 实现类文件名称
						  .formatXmlFileName("%sMapper");
			  })

				// 使用Freemarker引擎模板，默认的是Velocity引擎模板
			  .templateEngine(new FreemarkerTemplateEngine())
		  .execute();
	}

}
